package com.vhall.component.service.room;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.vhall.component.entity.account.dto.IndexDto;
import com.vhall.component.entity.export.dto.AdminExportRoomQueryCondition;
import com.vhall.component.entity.inav.vo.*;
import com.vhall.component.entity.rebroadcast.vo.ListReqVo;
import com.vhall.component.entity.record.vo.RoomRspVO;
import com.vhall.component.entity.room.dto.RoomExtendsDTO;
import com.vhall.component.entity.room.dto.RoomJoinsEntityDTO;
import com.vhall.component.entity.room.dto.RoomsEntityDTO;
import com.vhall.component.entity.room.entity.RoomJoinsEntity;
import com.vhall.component.entity.room.entity.RoomsEntity;
import com.vhall.component.entity.room.vo.*;
import com.vhall.component.entity.thirduser.ThirdUserVO;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * @author guoxin.wang
 * @date 2021/7/12 17:30
 */
public interface RoomInnerService {

    /**
     * 根据roomId查询信息
     *
     * @param roomId 房间号
     * @return 返回房间信息
     */
    RoomsEntityDTO getRoomInfo(String roomId);

    /**
     * 根据ilId查询信息
     *
     * @param ilId 房间号
     * @return 返回房间信息
     */
    RoomsEntityDTO getRoomInfoByIlId(String ilId);

    /**
     * 缓存并处理获取房间信息（加锁）
     *
     * @param infoId    房间信息id，room_id或者il_id
     * @param cacheKey  缓存key
     * @param queryType 查询类型，0=通过il_id 1=通过room_id
     * @return 房间信息
     */
    RoomsEntityDTO cacheAndHandleGetRoomInfo(String infoId, String cacheKey, int queryType);

    /**
     * 检查是否符合规则
     *
     * @param roomId 房间号
     */
    void checkRoomId(String roomId);

    /**
     * 查询房间信息
     *
     * @param roomIds 房间号
     * @return 返回房间信息
     */
    List<RoomsEntityDTO> getRoomInfoByRoomIds(List<String> roomIds);

    /**
     * 查询房间信息
     *
     * @param ilIds 房间号
     * @return 返回房间信息
     */
    List<RoomsEntityDTO> getRoomInfoByIlIds(List<Integer> ilIds);

    /**
     * 查询join信息
     *
     * @param roomId    房间号
     * @param accountId 房间号
     * @return 返回房间信息
     */
    RoomJoinsEntityDTO getRoomJoinInfo(Integer accountId, String roomId);


    /**
     * 设置问卷状态
     * <p>
     * 更新参会人 问卷回答状态
     *
     * @param joinId 参会id
     * @param flag   状态
     * @return 是否更新成功
     */
    Boolean setQuestionFlag(Integer joinId, Integer flag);

    /**
     * 查询当前在线的房间
     *
     * @return 返回房间信息
     */
    List<RoomsEntityDTO> listOnlineChannel();

    /**
     * 获取当前在线人数据
     *
     * @param reqVO 参数
     * @return 返回房间信息
     */
    GetOnlineListRspVO getOnlineList(GetOnlineListReqVO reqVO);

    /**
     * 获取互动用户列表 （嘉宾/助理等）
     *
     * @param reqVO 参数
     * @return UserListPage
     */
    UserListPage<GetUserListRspVO> getUserList(GetUserListReqVO reqVO);

    /**
     * 获取join数据
     *
     * @param accountId 账户id
     * @param roomId    房间id
     * @return RoomJoinsEntityDTO
     */
    RoomJoinsEntityDTO getRoomJoins(Integer accountId, String roomId);

    /**
     * 更新join数据
     *
     * @param roomJoinInfo 参数
     * @param type         设备类型，0未检测 1手机端 2PC 3SDK
     * @param status       设备状态，0未检测1可以上麦2不可以上麦
     */
    void updateRoomJoins(RoomJoinsEntityDTO roomJoinInfo, String type, String status);

    /**
     * 更新join数据
     *
     * @param roomJoinInfo 参数
     */
    void updateRoomJoinsById(RoomJoinsEntityDTO roomJoinInfo);

    /**
     * 获取join数据
     *
     * @param roomId  房间id
     * @param thirdId 第三方id
     * @return RoomJoinsEntityDTO
     */
    RoomJoinsEntityDTO getCurrentJoinUserByThirdId(String roomId, Integer thirdId);

    /**
     * 批量禁言
     *
     * @param roomId           房间id
     * @param accountIdList    用户id组
     * @param status           状态
     * @param thirdPartyUserId 第三方用户
     * @return 是否更新成功
     */
    Boolean batchBanned(String roomId, List<Integer> accountIdList, Integer status, Integer thirdPartyUserId);

    /**
     * 获取禁言人数
     *
     * @param roomId 房间id
     * @return 禁言人数
     */
    Integer getBannedNum(String roomId);

    /**
     * 批量踢出
     *
     * @param roomId           房间id
     * @param accountIdList    用户id
     * @param status           状态
     * @param thirdPartyUserId 第三方id
     * @return 是否成功踢出
     */
    Boolean batchKick(String roomId, List<Integer> accountIdList, Integer status, Integer thirdPartyUserId);

    /**
     * 获取禁言列表
     *
     * @param reqVO 参数
     * @return BannedAndKickedListRspVO
     */
    BannedAndKickedListRspVO getBannedList(BannedKickedReqVO reqVO);

    /**
     * 获取禁言列表（缓存）
     *
     * @param reqVO 参数
     * @return BannedKickedListRspVO
     */
    BannedKickedListRspVO getBannedCacheList(BannedKickedReqVO reqVO);

    /**
     * 获取踢出列表
     *
     * @param reqVO 参数
     * @return BannedAndKickedListRspVO
     */
    BannedAndKickedListRspVO getKickedList(BannedKickedReqVO reqVO);

    /**
     * 获取踢出列表（缓存）
     *
     * @param reqVO 参数
     * @return BannedKickedListRspVO
     */
    BannedKickedListRspVO getKickedCacheList(BannedKickedReqVO reqVO);

    /**
     * 获取禁言-剔出列表
     *
     * @param reqVO 参数
     * @return BannedAndKickedListRspVO
     */
    BannedAndKickedListRspVO listBannedKicked(BannedKickedReqVO reqVO);

    /**
     * 获取join数据
     *
     * @param reqVO 参数
     * @return RoomJoinsEntityDTO
     */
    RoomJoinsEntityDTO queryRoomJoinsBySelectOne(QueryRoomJoinsBySelectOneReqVO reqVO);

    /**
     * 获取supply信息
     *
     * @param ilId 房间id
     * @return 房间的supply信息
     */
    RoomSupplyEntityDTO getRoomSupplyByIlId(Integer ilId);

    /**
     * 更新或者插入join信息
     *
     * @param room         房间参数
     * @param profilePhoto 用户头像地址
     * @param accountId    账户id
     * @param roleName     权限标识
     * @param username     用户名
     * @param nickname     用户昵称
     * @return RoomJoinsEntityDTO 关联信息对象
     */
    RoomJoinsEntityDTO updateOrInsertRoomJoin(RoomsEntityDTO room, String profilePhoto, Integer accountId, Integer roleName, String username, String nickname);

    /**
     * 更新信息
     *
     * @param roomId           房间id
     * @param thirdPartyUserId 第三方账户id
     * @return 更新数量
     */
    int updateIsAnsweredVoteByJoinId(String roomId, String thirdPartyUserId);

    /**
     * 更新信息
     *
     * @param roomId           房间id
     * @param thirdPartyUserId 第三方用户id
     */
    void updateIsSignedByJoinId(String roomId, String thirdPartyUserId);

    /**
     * 获取信息
     *
     * @param roomId           房间id
     * @param thirdPartyUserId 第三方用户id
     * @return 参会信息
     */
    RoomJoinsEntityDTO getRoomJoinsByRoomIdAndThirdId(String roomId, Integer thirdPartyUserId);

    /**
     * 获取信息
     *
     * @param roomId PAAS房间id
     * @return 房间信息
     */
    RoomsEntityDTO getRoomsEntityInfo(String roomId);

    /**
     * 获取信息
     *
     * @param ilId     房间id
     * @param recordId 默认回放id
     * @return 通过房间id和回放id获取房间数量
     */
    Integer getCountByIlidAndRecordId(String ilId, String recordId);

    /**
     * 更新信息
     *
     * @param entity 参数
     * @return 更新数量
     */
    Integer updateByIl(RoomsEntityDTO entity);

    /**
     * 查询房间信息
     *
     * @param ilIdlist 房间id列表
     * @return 房间信息列表
     */
    List<RoomRspVO> selectRoomList(List<Integer> ilIdlist);

    /**
     * 查询房间信息
     *
     * @param roomId       房间id
     * @param senderIdList 发送信息人id列表
     * @return Map<Integer, RoomJoinsEntityDTO>
     */
    Map<Integer, RoomJoinsEntityDTO> getRoomInfoBySenderIds(String roomId, String senderIdList);

    /**
     * 查询房间信息
     *
     * @param roomId     房间id
     * @param accountIds 用户id列表
     * @return List<RoomJoinsEntityDTO>
     */
    List<RoomJoinsEntityDTO> getRoomInfoByAccountIds(String roomId, String accountIds);

    /**
     * 更新房间信息
     *
     * @param rooms 参数
     */
    void updateLikeById(RoomsEntityDTO rooms);

    /**
     * 获取房间信息
     *
     * @param ilId 房间id
     * @return 房间信息
     */
    RoomsEntityDTO getRoomInfoById(Integer ilId);

    /**
     * 获取房间信息
     *
     * @param roomIds 房间id组
     * @return List<RoomsEntityDTO>
     */
    List<RoomsEntityDTO> getRoomsInfoByRoomIds(String roomIds);

    /**
     * 获取房间信息
     *
     * @param reqVo 参数
     * @return Map<String, Object>
     */
    Map<String, Object> getRoomsEntityByRebroadcastList(ListReqVo reqVo);

    /**
     * 获取房间扩展信息
     *
     * @param roomId 房间id
     * @return RoomExtendsDTO
     */
    RoomExtendsDTO getRoomExtendsByRoomId(String roomId);

    /**
     * 获取房间join信息
     *
     * @param reqVO 参数
     * @return List<RoomJoinsEntityDTO>
     */
    List<RoomJoinsEntityDTO> getRoomJoinsList(QueryRoomJoinsReqVO reqVO);

    /**
     * 更新获奖人信息
     *
     * @param roomJoinsEntityDTO 参数
     * @param roomId             房间id
     * @param accountIds         账户id列表
     * @return 更新数量
     */
    Integer updateLotteryWinner(RoomJoinsEntityDTO roomJoinsEntityDTO, String roomId, List<Integer> accountIds);

    /**
     * 根据roomId获取主讲人
     *
     * @param roomId 房间id
     * @return RoomJoinsEntityDTO
     */
    RoomJoinsEntityDTO getHostUserInfoByRoomId(String roomId);

    /**
     * 获取总条数
     *
     * @param beginTime 统计时间
     * @return IndexDto
     */
    IndexDto getCount(String beginTime);

    /**
     * 获取房间数量,指定某个区域,区域不传递时是全部区域
     * @param beginTime
     * @param orgCode
     * @return
     */
    IndexDto getCount(String beginTime, String orgCode);
    Integer sumMessageTotal(Integer ilId, LocalDateTime beginTime, LocalDateTime endTime);

    RoomJoinsEntity getAnchorInfo(String roomId, Integer accountId);

    /**
     * 针对admin导出计算总条数
     *
     * @param condition 查询条件
     * @return 总条数
     * @author yuanzh
     */
    int countRoomForAdminExport(AdminExportRoomQueryCondition condition);

    /**
     * 获取房间暖场信息
     *
     * @param ilId 房间id
     * @return 暖场信息
     */
    Map<String, Object> getRoomWarmInfo(Integer ilId);

    /**
     * 查询  roomSupply
     *
     * @param roomId 房间id
     * @return 房间关联信息
     */
    RoomSupplyEntityDTO getRoomSupplyByRoomId(String roomId);

    /**
     * 根据房间id更新扩展表开关状态
     *
     * @param roomId 房间id
     * @param status 功能开关状态 1.开启 0.关闭
     * @param type   功能类型 (.跑马灯 2.敏感词 3.自定义菜单 4.挂件 5.问卷)
     */
    void updateConfigValueByRoomId(String roomId, Integer status, String type);

    /**
     * 根据用户id更新或新增扩展表开关状态
     *
     * @param accountId roomId 用户id
     * @param status    功能开关状态 1.开启 0.关闭
     * @param type      功能类型 filter_words_status 敏感词 pendant_status 挂件
     */
    void insertOrUpdateRoomConfigByAccountId(Integer accountId, Integer status, String type);

    /**
     * 根据accountId与关键字获取房间列表
     *
     * @param roomInneristVO 请求vo类
     * @return Page<RoomsEntityVO>
     */
    Page<RoomsEntityVO> getRoomsListByAccountId(RoomInnerListVO roomInneristVO);

    /**
     * 设置房间'发送表情限频'
     *
     * @param roomId        房间id
     * @param giftFrequency '发送表情限频'
     * @return 是否设置成功
     */
    Boolean setGiftFrequency(String roomId, Integer giftFrequency);

    /**
     * 指定账号下获取当前开播房间
     *
     * @param accountId 用户账号id
     * @return 开播房间列表List<RoomsEntityDTO>
     */
    List<RoomsEntityDTO> listOnlineChannelOnAccount(Integer accountId);

    /**
     * 获取默认水印模板 id
     *
     * @return 默认水印模板 id
     */
    String getDefaultWatermarkTemplateId();

    void setDefaultWatermarkTemplateId(Integer watermarkTemplateId);

    void clearRoomWatermark(String tempId);

    Long getVirtualPV(Integer ilId);
    Map<Integer, Long> getVirtualPV(List<Integer> ilIds);

    /**
     * 获取直播显示状态
     * - 观看端,直播间如果未到开播时间,则显示待直播状态
     * - 特殊情况,
     *      - 测试直播间显示直播正常状态
     *      - 主持人显示直播正常状态
     *      - 直播时间已过显示正常状态
     * @param room
     * @return
     */
    Integer getShowRoomStatus(RoomsEntityDTO room);
    /**
     * 获取直播显示状态
     * - 观看端,直播间如果未到开播时间,则显示待直播状态
     * - 特殊情况,
     *      - 测试直播间显示直播正常状态
     *      - 主持人显示直播正常状态
     *      - 直播时间已过显示正常状态
     * @param room
     * @return
     */
    Integer getShowRoomStatus(RoomsEntity room);
    /**
     * 缓存获取房间关联的主播信息-包含投顾信息
     * @param ilId
     * @return
     */
    List<ThirdUserVO> getCacheRoomAnchorInfoList(Integer ilId);


}

